package cn.tworice.admin.service.impl;

import cn.tworice.admin.dao.SystemDao;
import cn.tworice.admin.service.SystemService;
import cn.tworice.common.entity.Admin;
import cn.tworice.common.entity.Role;
import cn.tworice.common.entity.Resources;
import cn.tworice.common.entity.RoleResources;
import cn.tworice.common.entity.dto.ResourcesDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;

/**
 * 系统管理模块业务层
 *
 * @author 二饭
 * @email 1786705138@qq.com
 */
@Service
public class SystemServiceImpl implements SystemService {

    @Autowired
    private SystemDao systemDao;

    /**
     * 添加或更新资源
     * @author 二饭
     * @email 1786705138@qq.com
     */
    @Override
    public int editResource(Resources resources) {
        int i=0;
        if(resources.getName()==null || resources.getName().isEmpty() || resources.getPid()==null || resources.getSort()==null || resources.getType()==null){
            return i;
        }
        if (resources.getId() == null || resources.getId() == 0) {
            i=systemDao.insertResource(resources);
        } else {
            i=systemDao.updateResource(resources);
        }
        return i;
    }

    /**
     * 批量删除资源
     * @author 二饭
     * @email 1786705138@qq.com
     */
    @Override
    public int delResources(Integer[] ids) {
        List<Integer> list = List.of(ids);
        return systemDao.delResources(list);
    }

    /**
     * 通过条件查询资源
     * @author 二饭
     * @email 1786705138@qq.com
     */
    @Override
    public List<ResourcesDto> selectResources(String name) {
        // TODO 通过资源名称查询资源
//        List<ResourcesDto> list=systemDao.queryResources(name);
        return null;
    }

    /**
     * 获取所有角色列表
     * @author 二饭
     * @email 1786705138@qq.com
     */
    @Override
    public List<Role> getRoleList() {
        return systemDao.queryRoles();
    }

    /**
     * 根据角色ID获取人员列表
     * @author 二饭
     * @email 1786705138@qq.com
     */
    @Override
    public List<Admin> getAdminListByRoleId(Integer roleId) {
        return systemDao.queryAdminByRoleId(roleId);
    }

    /**
     * 添加人员到角色
     * @author 二饭
     * @email 1786705138@qq.com
     */
    @Override
    public int addAdminToRole(String[] adminId, Integer roleId) {
        // 判断该角色中有没有该人员
        int i=systemDao.queryAdminInRole(adminId,roleId);
        if(i==0){
            // 如果没有
            return systemDao.insertAdminToRole(adminId, roleId);
        }

        return 0;
    }

    /**
     * 从角色中移除人员
     * @author 二饭
     * @email 1786705138@qq.com
     */
    @Override
    public void delAdminToRole(String[] adminIds, Integer roleId) {
        systemDao.rmAdminToRole(adminIds, roleId);
    }

    /**
     * 获取不是该角色的人员
     * @author 二饭
     * @email 1786705138@qq.com
     */
    @Override
    public List<Admin> getNoRoleAdmin(int roleId) {
        return systemDao.queryNoRoleAdmin(roleId);
    }

    /**
     * 通过用户状态查询用户
     * @author 二饭
     * @email 1786705138@qq.com
     */
    @Override
    public List<Admin> getAdminByStatus(Integer status) {
        return systemDao.queryAdminByStatus(status);
    }

    /**
     * 通过角色ID查询资源
     * @author 二饭
     * @email 1786705138@qq.com
     */
    @Override
    public List<RoleResources> getResourcesByRoleId(Integer roleId) {
        List<RoleResources> list=systemDao.queryResourcesByRoleId(roleId);

        return list;
    }

    /**
     * 更新角色权限资源
     * @author 二饭
     * @email 1786705138@qq.com
     */
    @Override
    public Boolean updateRoleResources(Integer[] haveResources, Integer[] updateResources, Integer roleId) {
        List<Integer> addResources = new ArrayList<>();
        List<Integer> rmResources = new ArrayList<>();
        // 计算增加的资源权限
        for(Integer i:updateResources){
            // 该ID原来未被选中
            if(Arrays.asList(haveResources).indexOf(i)==-1){
                addResources.add(i);
            }
        }
        // 计算删除的资源权限
        for(Integer i:haveResources){
            // 该ID现在被取消
            if(Arrays.asList(updateResources).indexOf(i)==-1){
                rmResources.add(i);
            }
        }

        if(addResources.size()!=0){
            systemDao.insertRoleResources(addResources,roleId);
        }
        if(rmResources.size()!=0){
            systemDao.rmRoleResources(rmResources, roleId);
        }

        return true;
    }

    /**
     * 删除角色
     * 需要同时删除 角色表 和 角色资源表 所有相关内容
     * @author 二饭
     * @email 1786705138@qq.com
     */
    @Override
    public int delRole(Integer roleId) {

        int i=systemDao.delRole(roleId);
        if(i==1){
            systemDao.delRoleResources(roleId);
        }
        return i;
    }

    /**
     * 更新或插入角色
     * @author 二饭
     * @email 1786705138@qq.com
     */
    @Override
    public int editRole(Integer roleId, String roleName) {
        int i=0;
        if (roleId == -1) {
            // 插入
            i = systemDao.insertRole(roleName);
        } else {
            // 更新
            i = systemDao.updateRole(roleId, roleName);

        }
        return i;
    }

    /**
     * 获取所有管理员账号信息
     * @author 二饭
     * @email 1786705138@qq.com
     */
    @Override
    public List<Admin> getAdminList() {
        return systemDao.queryAdminList();
    }

    /**
     * 添加一个管理员账号，返回添加管理员账号后的账号信息
     * @author 二饭
     * @email 1786705138@qq.com
     */
    @Override
    public List<Admin> addAdmin(Admin admin) {
        if(admin.getId()==null||admin.getId().isEmpty()){
            admin.setStatus(0);
            admin.setId(UUID.randomUUID().toString().replaceAll("-",""));
            systemDao.insertAdmin(admin);
        }else{
            systemDao.updateAdmin(admin);
        }

        return getAdminList();
    }

    /**
     * 删除管理员账号
     * @author 二饭
     * @email 1786705138@qq.com
     */
    @Override
    public List<Admin> delAdminByIds(String[] ids) {
        systemDao.delAdmin(ids);
        return getAdminList();
    }

    /**
     * 更新管理员密码
     * @Author 二饭
     * @Email 1786705138@qq.com
     * @Date 2021/12/3 20:44
     */
    @Override
    public boolean updateAdminInfo(Admin admin) {
        int i=systemDao.updateAdminPwd(admin);
        if(i==1){
            return true;
        }else {
            return false;
        }
    }

    /**
     * 更新角色的资源权限
     * @Author 二饭
     * @Email 1786705138@qq.com
     * @Date 2021/12/8 19:15
     */
    @Override
    public Boolean setRoleResources(Integer roleId, Integer[] resourcesId) {
        // 删除原有资源权限
        systemDao.delRoleResources(roleId);
        // 设置新的资源权限（资源的叶子节点）
        systemDao.insertRoleResource(roleId,resourcesId);
        return true;
    }


}
